package com.caizongzhen.www.controller;

import com.caizongzhen.www.dto.VerifyParaDto;
import com.caizongzhen.www.entity.User;
import com.caizongzhen.www.service.UserService;
import com.caizongzhen.www.util.Assert;
import com.caizongzhen.www.util.RespResult;
import com.caizongzhen.www.util.VerifyFormat;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpSession;
import java.util.Date;

@Controller
public class UserController {
    @Autowired
    private UserService userService;

    /*
     * 退出登录
     * */
    @GetMapping("/logout")
    public String logout(HttpSession session){
        session.invalidate();
        return "redirect:/index";
    }


    /*
    * 修改密码
    * */
    @PostMapping ("/user/savePassword")
    @ResponseBody
    public RespResult savePassword(String oldPass, String newPass,HttpSession session){
        VerifyParaDto verifyParaDto = new VerifyParaDto();
        User user = (User) session.getAttribute("loginUser");
        // 判断用户是否为空
        if (Assert.isEmpty(user)) {
            return RespResult.fail("未登录不能修改密码");
        }
        // 判断密码是否可用
        verifyParaDto = verifyParaPwd(oldPass,newPass,user);
        if (!verifyParaDto.Tag) {
            return RespResult.fail(verifyParaDto.Msg);
        }
        // 修改密码
        user.setUserPwd(newPass);
        user.setUpdateTime(new Date());
        boolean bool = userService.saveOrUpdate(user);
        if (bool) return RespResult.success("修改密码成功");
        else return RespResult.fail("修改密码失败");
    }

    /*
     * 个人资料页面
     * */
    @GetMapping("/profile")
    public String profile(HttpSession session){
        if(Assert.isEmpty((User)session.getAttribute("loginUser"))) return "redirect:/index";
        return "profile";
    }

    /*
    * 修改用户信息
    * */
    @PostMapping ("/user/saveProfile")
    @ResponseBody
    public RespResult saveProfile(User user1,HttpSession session){
        VerifyParaDto verifyParaDto = new VerifyParaDto();
        // 获取登录的用户
        User user2 = (User) session.getAttribute("loginUser");
        verifyParaDto = alterProfile(user1,user2);
        if (!verifyParaDto.Tag) return RespResult.fail(verifyParaDto.Msg);
        User user = getNewUser(user1,user2);
        boolean bool = userService.saveOrUpdate(user);
        if (bool) return RespResult.success("修改信息成功");
        else return RespResult.fail("修改信息失败");
    }


    /*
    * 组合修改后的User信息
    * */
    private User getNewUser(User user1,User user2){
        user2.setUserName(user1.getUserName());
        user2.setUserAge(user1.getUserAge());
        user2.setUserTel(user1.getUserTel());
        user2.setUpdateTime(new Date());
        return user2;
    }

    /*
    * 验证修改用户信息，提交的数据是否合法
    * */
    private VerifyParaDto alterProfile(User user1,User user2){
        VerifyParaDto verifyParaDto = new VerifyParaDto();
        verifyParaDto.Tag = false;
        // 判断用户是否登录
        if (Assert.isEmpty(user2)) {
            verifyParaDto.Msg = "未登录不能修改信息";
            return verifyParaDto;
        }
        // 判断传入参数是否有Id（有Id才能修改对应的用户）
        if (Assert.isEmpty(user1.getId())) {
            verifyParaDto.Msg = "没有Id参数";
            return verifyParaDto;
        }
        // 判断登录的用户与被修改的用户是否相同
        if (!user2.getId().equals(user1.getId())) {
            verifyParaDto.Msg = "登录用户与修改的用户不相同";
            return verifyParaDto;
        }
        // 手机号格式是否正确
        if (!VerifyFormat.verifyFormatMobile(user1.getUserTel())) {
            verifyParaDto.Msg = "手机号格式不正确";
            return verifyParaDto;
        }
        verifyParaDto.Tag = true;
        return verifyParaDto;
    }

    /*
    * 验证修改密码，提交的数据是否合法
    * */
    private VerifyParaDto verifyParaPwd(String oldPass, String newPass,User user){
        VerifyParaDto verifyParaDto = new VerifyParaDto();
        verifyParaDto.Tag = true;
        // 判断密码是否为空
        if (Assert.isEmpty(oldPass) || Assert.isEmpty(newPass)) {
            verifyParaDto.Tag = false;
            verifyParaDto.Msg = "密码不能为空";
            return verifyParaDto;
        }
        // 判断 输入的 老密码 是否正确
        if (!user.getUserPwd().equals(oldPass)) {
            verifyParaDto.Tag = false;
            verifyParaDto.Msg = "输入的旧密码不正确";
            return verifyParaDto;
        }
        // 新密码 不能与 旧密码 相同
        if(oldPass.equals(newPass)) {
            verifyParaDto.Tag = false;
            verifyParaDto.Msg = "新密码不能与旧密码相同";
            return verifyParaDto;
        }
        return verifyParaDto;
    }
}
